#!/usr/bin/env python
# -*- coding: utf-8; -*-

from django import forms
# from django.db.models import F

from web import models
from web.forms.bootstrap import BootstrapForm


class WikiModelForm(BootstrapForm, forms.ModelForm):
    class Meta:
        model = models.Wiki
        # 将 project 在表单内剔除，因为新增wiki时项目不应该可选，应该是固定的
        # 视图函数进行表单验证后，我们可以手动设置表单数据中的项目值，然后执行
        # form.save()
        exclude = [
            'project',
        ]

    # BUG parent 的编辑涉及前端页面的wiki目录展示，后续重写该字段的校验钩子
    # 函数，目前有些情景下改变父文章容易导致wiki目录的无法显示
    # def clean_depth(self):
    #     depth = self.cleaned_data.get('depth')

    #     # 若指定父文章为自身，会导致wiki目录显示错误，暂时处理为该操作为无
    #     # 效操作，默认无父目录, 处理见视图函数
    #     if self.instance and depth > self.instance.depth :
    #         depth = self.instance.depth
    #     return depth

    def __init__(self, request, *args, **kwargs):
        super().__init__(*args, **kwargs)

        # 重载 __init__ 方法，过滤限制每次表单实例化时的“父文章”只能同位于
        # 一个项目

        # 找到想要的字段把他绑定显示的数据重置
        # 数据 = 去数据库中获取 当前项目所有的wiki标题

        total_data_list = [
            ("", "请选择"),
        ]
        # 创建文章时，wiki表中所有记录都可以作为新文章的父目录，但编辑时不
        # 应该自身为自身的父文章，所以查询需要进一步过滤
        data_list = models.Wiki.objects.filter(
            project=request.tracer.project).exclude(
                id=self.instance.id).values_list('id', 'title')

        # 上面的 self.instance.id 不可用 F('id') 来替代，因为 F 表达式常用
        # 来更新某写记录、获取记录中的字段值，这里使用F表达式的意思就变为：
        # “排除id为当前记录id的记录”，导致查询集永远为空

        # # values_list 查询后无法再次 delete
        # data_list.filter(id=self.instance.id).delete()

        total_data_list.extend(data_list)

        # 如何修改表单某一字段的选择项？
        #
        # 修改表单对象 self.fields['field_name'].choices 值，将一个列表传入，
        # 列表的元素为元组(?)
        self.fields['parent'].choices = total_data_list
